package com.itheima.d2_reflect;

import org.junit.Test;

import java.lang.reflect.Method;

/*
    目标：掌握获取类的成员方法，并对其进行操作。

    Class类中的方法
        Method[] getMethods()	获取类的全部成员方法（只能获取public修饰的）
        Method[] getDeclaredMethods()	获取类的全部成员方法（只要存在就能拿到）
        Method getMethod(String name, Class<?>... parameterTypes) 	获取类的某个成员方法（只能获取public修饰的）
        Method getDeclaredMethod(String name, Class<?>... parameterTypes)	获取类的某个成员方法（只要存在就能拿到）
    Method提供的方法
        public Object invoke(Object obj, Object... args)	触发某个对象的该方法执行。
        public void  setAccessible(boolean flag)	设置为true，表示禁止检查访问控制（暴力反射）
 */
public class Test4Method {
    @Test
    public void testGetMethods() throws Exception {
        //如何获取方法
        Class catClass = Cat.class;
        //获取全部的public修饰的成员方法，同时也会获得父类的方法
//        Method[] methods = catClass.getMethods();
//        for (Method method : methods) {
//            System.out.println(method);
//        }
        //获取全部的成员方法，不管被谁修饰都能获取
//        Method[] declaredMethods = catClass.getDeclaredMethods();
//        for (Method declaredMethod : declaredMethods) {
//            System.out.println(declaredMethod);
        //获取某一个成员方法被public修饰的
        //需要传入方法名称和对应的方法的参数
        Method method = catClass.getMethod("eat");
        System.out.println(method);
        //获取某一个方法，不论被谁修饰
        Method eat = catClass.getDeclaredMethod("eat", String.class);
        System.out.println(eat);
        //调用方法
//        public Object invoke(Object obj, Object... args)	触发某个对象的该方法执行。
//        public void  setAccessible(boolean flag)	设置为true，表示禁止检查访问控制（暴力反射）
        eat.setAccessible(true);
        Cat cat = new Cat();
        Object o =  eat.invoke(cat, "狗屎");
        System.out.println(o);


    }
    }
